"""
@Time ： 2023/12/14 18:42
@Auth ： 莫天杨
@File ：jt808_0200.py
@IDE ：PyCharm
@Motto:大道无术
"""
from datetime import datetime


def parse_location_info(body):
    # 解析0x0200位置信息消息体
    data = {
        "报警标志": str(parse_alarms_from_bit(body[0:8])) + '(' + str(
            bin(int(body[0:8], 16))[2:].zfill(32)) + ')' + '(' + body[0:8] + ')',
        "终端状态": '\n' + str(parse_location_status(int(body[8:16], 16))) + ' (' + bin(int(body[8:16], 16))[2:].zfill(32) + ')(' + body[8:16] + ')',
        "纬      度": str(int(body[16:24], 16) / 1000000) + '° (' + body[16:24] + ')',
        "经      度": str(int(body[24:32], 16) / 1000000) + '° (' + body[24:32] + ')',
        "高      程": str(int(body[32:36], 16)) + ' 米 (' + body[32:36] + ')',
        "速      度": str(int(body[36:40], 16) / 10) + ' km/h (' + body[36:40] + ')',
        "方      向": str(int(body[40:44], 16)) + '° (' + body[40:44] + ')',
        "时      间": datetime.strptime(body[44:56], '%y%m%d%H%M%S').strftime('%y-%m-%d %H:%M:%S') + ' (' + body[
                                                                                                            44:56] + ')',
        # Add more fields here according to the actual message structure
    }
    formatted_data = ""
    for key, value in data.items():
        formatted_data += f"{key}: {value}\n"
    return formatted_data


def parse_alarms_from_bit(alarm_byte):
    alarm_types = ['紧急报警', '超速报警', '疲劳驾驶', '预警', 'GNSS 模块发生故障', 'GNSS 天线未接或被剪断',
                   'GNSS 天线短路',
                   '终端主电源欠压', '终端主电源掉电', '终端 LCD 或显示器故障', 'TTS 模块故障', '摄像头故障', '保留',
                   '保留', '保留',
                   '保留', '保留', '保留', '当天累计驾驶超时', '超时停车', '进出区域', '进出路线',
                   '路段行驶时间不足/过长', '路线偏离报警',
                   '车辆 VSS 故障', '车辆油量异常', '车辆被盗(通过车辆防盗器)', '车辆非法点火', '车辆非法位移', '保留',
                   '保留', '保留']
    # 确保字符串长度为32，不足的话左侧补0
    binary_string = bin(int(alarm_byte, 16))[2:].zfill(32)
    # 使用位掩码检查每个位
    alarms = []
    for bit_position in range(32):
        if binary_string[bit_position] == '1':
            alarms.append(alarm_types[31 - bit_position])
    return alarms


def parse_location_status(status_value):
    status_descriptions = [
        ("ACC 关", "ACC 开"),
        ("未定位", "定位"),
        ("北纬", "南纬"),
        ("东经", "西经"),
        ("运营状态", "停运状态"),
        ("经纬度未经保密插件加密", "经纬度已经保密插件加密"),
        ("保留", "保留"),
        ("保留", "保留"),
        ("", ""),
        ("", ""),
        ("车辆油路正常", "车辆油路断开"),
        ("车辆电路正常", "车辆电路断开"),
        ("车门加锁", "车门加锁"),
        ("门 1 关(前门)", "门 1 开(前门)"),
        ("门 2 关(中门)", "门 2 开(中门)"),
        ("门 3 关(后门)", "门 3 开(后门)"),
        ("门 4 关(驾驶席门)", "门 4 开(驾驶席门)"),
        ("门 5 关(自定义)", "门 5 开(自定义)"),
        ("未使用 GPS 卫星进行定位", "使用 GPS 卫星进行定位"),
        ("未使用北斗卫星进行定位", "使用北斗卫星进行定位"),
        ("未使用 GLONASS 卫星进行定位", "使用 GLONASS 卫星进行定位"),
        ("未使用 Galileo 卫星进行定位", "使用 Galileo 卫星进行定位"),
        ("保留", "保留"),
        ("保留", "保留"),
        ("保留", "保留"),
        ("保留", "保留"),
        ("保留", "保留"),
        ("保留", "保留"),
        ("保留", "保留"),
        ("保留", "保留"),
        ("保留", "保留"),
        ("保留", "保留"),
        # 添加其他状态位的描述
    ]
    bit_statuses = ["{}({})".format(status_descriptions[i][(status_value >> i) & 1], (status_value >> i) & 1) for i in range(32)]
    result_status = " ".join(bit_statuses)
    return result_status


__all__ = ['parse_location_info']